﻿package model.memCached;

import util.KPrintInfo;

import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;

import config.LoadFile;

import java.util.Date;

public class MemCachedManage {
	static private MemCachedManage	memCachedManage	= new MemCachedManage();
	
	private MemCachedClient			mcc;
	
	static public MemCachedManage getInstance() {
		return memCachedManage;
	}
	
	public void init() {
		KPrintInfo.println("connection  memcach....");
		
		// 服务器列表和其权 重
		// String[] servers = { "127.0.0.1:11211" };
		String[] servers = loadConfigFile();
		
		// 获取socke连接池的实例对象
		SockIOPool pool = SockIOPool.getInstance();
		// 设置服务器信息
		pool.setServers(servers);
		pool.setFailover(true);
		
		// 设置初始连接数、最小和最大连接数以及最大处理时间
		pool.setInitConn(10);
		pool.setMinConn(5);
		pool.setMaxConn(250);
		pool.setMaxIdle(1000 * 60 * 60 * 6);
		
		// 设置主线程的睡眠时间
		pool.setMaintSleep(30);
		
		// 对上一次发送的包的确认信息到来；这个方法就可以关闭套接字的缓存，
		// 以至这个包准备好了就发；
		pool.setNagle(false);
		
		// 连接建立后对超时的控制
		pool.setSocketTO(3000);
		
		// 连接建立时对超时的控制
		pool.setSocketConnectTO(0);
		pool.setAliveCheck(true);
		
		// 连接建立时对超时的控制
		pool.initialize();
		
		mcc = new MemCachedClient();
		
		// 压缩设置，超过指定大小（单位为K）的数据都会被压缩
		// mcc.setCompressEnable(true);
		// mcc.setCompressThreshold(64 * 1024);
		
		add("Memcached", "kings");
		String str = get("Memcached").toString();
		
		if (str.equals("kings") ) {
			KPrintInfo.println("MemCached is start success -----");
		} else {
			KPrintInfo.println("MemCached is start faile -----");
		}
		
	}
	
	private String[] loadConfigFile() {
		LoadFile ld = new LoadFile();
		String fString = ld.Load("config/memcachedServerConfig");
		String[] strArrStrings = fString.split("\r\n");
		return strArrStrings;
	}
	
	public void add(String key, Object value) {
		mcc.add(key, value);
	}
	
	public boolean replace(String key, Object value) {
		return mcc.replace(key, value);
	}
	
	public boolean replace(String key, Object value, Date expiry) {
		return mcc.replace(key, value, expiry);
	}
	
	/**
	 * 根据指定的关键字获取对象.
	 * 
	 * @param key
	 * @return
	 */
	public Object get(String key) {
		return mcc.get(key);
	}
	
	public Boolean delete(String key) {
		mcc.delete(key);
		return false;
	}
	// /end class
}
